package cn.iocoder.lw.module.core.service.house;

import cn.iocoder.lw.framework.common.pojo.PageResult;
import cn.iocoder.lw.module.core.controller.admin.house.vo.*;
import cn.iocoder.lw.module.core.dal.dataobject.house.CoreHouseDO;

import java.math.BigDecimal;
import java.util.List;

/**
 * 核心房源 Service 接口
 *
 * @author Lw源码
 */
public interface CoreHouseService {

    /**
     * 创建房源
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createHouse( CoreHouseSaveReqVO createReqVO);


    /**
     * 更新房源
     *
     * @param updateReqVO 更新信息
     */
    void updateHouse( CoreHouseSaveReqVO updateReqVO);

    /**
     * 删除房源
     *
     * @param id 编号
     */
    void deleteHouse(Long id);

    /**
     * 获得房源
     *
     * @param id 编号
     * @return 房源
     */
    CoreHouseRespVO getHouse(Long id);

    /**
     * 获得房源原始数据
     *
     * @param id 编号
     * @return 房源
     */
    CoreHouseDO getHouseRaw(Long id);

    /**
     * 获得房源分页
     *
     * @param pageReqVO 分页查询
     * @return 房源分页
     */
    PageResult<CoreHouseRespVO> getHousePage(CoreHousePageReqVO pageReqVO);


    /**
     * 获得房源列表, 用于 Excel 导出
     *
     * @param pageReqVO 分页查询
     * @return 房源列表
     */
    PageResult<CoreHouseImportExcelVO> getHouseList(CoreHousePageReqVO pageReqVO);

    /**
     * 校验房源是否存在
     *
     * @param id 编号
     */
    void validateHouseExists(Long id);

    /**
     * 根据项目编号获取房源列表
     *
     * @param projectId 项目编号
     * @return 房源列表
     */
    List<CoreHouseRespVO> getHouseListByProjectId(Long projectId);

    /**
     * 根据项目编号获取房源原始数据列表
     *
     * @param projectId 项目编号
     * @return 房源列表
     */
    List<CoreHouseDO> getHouseListByProjectIdRaw(Long projectId);

    /**
     * 根据项目ID和房源状态统计房源数量
     *
     * @param projectId 项目编号
     * @param status 房源状态
     * @return 房源数量
     */
    long countByProjectIdAndStatus(Long projectId, Integer status);

    /**
     * 根据水表编号获取房源
     *
     * @param waterMeterNumber 水表编号
     * @return 房源
     */
    CoreHouseRespVO getHouseByWaterMeterNumber(String waterMeterNumber);

    /**
     * 根据电表编号获取房源
     *
     * @param electricityMeterNumber 电表编号
     * @return 房源
     */
    CoreHouseRespVO getHouseByElectricityMeterNumber(String electricityMeterNumber);

    /**
     * 根据门锁编号获取房源
     *
     * @param lockNumber 门锁编号
     * @return 房源
     */
    CoreHouseRespVO getHouseByLockNumber(String lockNumber);

    /**
     * 根据楼栋和楼层获取房源列表
     *
     * @param building 楼栋
     * @param floor 楼层
     * @return 房源列表
     */
    List<CoreHouseRespVO > getHouseListByBuildingAndFloor(String building, String floor);

    /**
     * 批量更新房源状态
     *
     * @param ids 房源编号列表
     * @param status 房源状态
     */
    void batchUpdateHouseStatus(List<Long> ids, Integer status);

    /**
     * 计算项目总租金收入
     *
     * @param projectId 项目编号
     * @return 总租金收入
     */
    BigDecimal calculateTotalRentByProjectId(Long projectId);

    /**
     * 批量导入房源
     *
     * @param importData 导入数据列表
     * @return 导入结果
     */
    CoreHouseImportRespVO importHouseList(List<CoreHouseImportExcelVO> importData);


}